//
//  WBNetworkManager.swift
//  WinsonWeibo
//
//  Created by Administrator on 2017/4/15.
//  Copyright © 2017年 Winson. All rights reserved.
//

import UIKit
import AFNetworking

// Swift的枚举支持任意数据类型
enum WBHTTPMethod {
    case GET
    case POST
}

/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {

    // 单例模式 静态区／ 常量 ／ 闭包 
    // 在第一次访问时， 执行闭包， 并且将结果保存在shared 常量中
    static let shared: WBNetworkManager = {

        let instance = WBNetworkManager()
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        instance.requestSerializer.timeoutInterval = 5
        
        return instance
    }()

    lazy var userAccount = WBUserAccount()
    /// 定义计算情属性的用户登录标志
    var userLogon: Bool {

        return userAccount.access_token != nil ? true : false
    }

    /// 专门负责 拼接token的网络请求方法
    func tokenRequest(method: WBHTTPMethod = WBHTTPMethod.GET, URLString: String, paramers:[String: Any]?, completion: @escaping(_ json: Any?, _ isSuccess:Bool)->()) -> () {

        //  处理token字典
        // 1> 判断 token 是否为 nil 如果为 nil 直接返回
        guard let token = userAccount.access_token else {

            // 发送通知， 通知用户登录
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WeiboUserShouldLoginNotification), object: nil)

            print("没有token！ 需要登录！")
            completion(nil, false)
            return
        }
        // 1> 判断 参数字典是否存在， 如果为 nil， 应该新建一个字典
        var paramers = paramers
        if paramers == nil {
            paramers = [String: Any]()
        }
        // 2> 设置参数字典，代码在此处 字典 一定 有值
        paramers!["access_token"] = token

        // 调用request发起真正的网络请求
        request(URLString: URLString, paramers: paramers, completion: completion)

    }


    /// 使用一个函数封装 AFN 的 GET ／ POST 请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URLString
    ///   - paramers: paramers
    ///   - completion: 完成回调[字典／数组] （为什么时any？）
    func request(method: WBHTTPMethod = WBHTTPMethod.GET, URLString: String, paramers:[String: Any]?, completion: @escaping(_ json: Any?, _ isSuccess:Bool)->()) {

        // 成功回调
        let success = {(task: URLSessionDataTask, json: Any?) -> () in
            completion(json, true)
        }
        // 失败回调
        let failure = {(task: URLSessionDataTask?, error: Error) -> () in

            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                // 发送通知 通知用户再次登录
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WeiboUserShouldLoginNotification), object: "bad token")
            }
            print("网络请求错误\(error.localizedDescription)")
            completion(nil, false)
        }
        if method == WBHTTPMethod.GET {
            get(URLString, parameters: paramers, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: paramers, progress: nil, success: success, failure: failure)
        }
    }

}
